package cn.edu.cqyz.wisdom.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

/**
 * @Description TODO
 * @Author CDHong
 * @Date Created in 2024/12/5 9:13
 * @Version 1.0
 */
@Service
public class AiKimiService {

    @Value("sk-EYv3lyEFOG9kCnPFCNjqLf2RPSpv9tBPLHcSFySJoiwDiIrM")
    private String apiKey;
    @Value("https://api.moonshot.cn/v1/chat/completions")
    private String baseUrl;

    /**
     * @Description 发送请求，请求方式必须是POST，发送的请求是一个JSON字符串，响应也是JSON字符串
     * @Author CDHong
     * @Param [userQuery]
     * @Date 2024/12/5 9:24
     **/
    public String sendRequest(String userQuery) throws Exception {
        HttpClient client = HttpClient.newHttpClient();

        /*
         * 请求体格式
         * {
         *   "model": "moonshot-v1-8k", // 模型名称，根据您的需求选择合适的模型
         *   "messages": [
         *     {
         *       "role": "system",
         *       "content": "你是Kimi，由Moonshot AI提供的人工智能助手，你更擅长中文和英文的对话。你会为用户提供安全，有帮助，准确的回答。同时，你会拒绝一切涉及恐怖主义，种族歧视，黄色暴力等问题的回答。Moonshot AI为专有名词，不可翻译成其他语言。"
         *     },
         *     {
         *       "role": "user",
         *       "content": "你是谁？" // 用户的问题或指令
         *     }
         *   ],
         *   "temperature": 0.5 // 可选参数，控制回答的创造性，范围0-1
         * }
         **/
        //String json = "{\"model\": \"moonshot-v1-8k\", \"messages\": [{\"role\": \"system\", \"content\": \"你是Kimi，由Moonshot AI提供的人工智能助手，你更擅长中文和英文的对话。你会为用户提供安全，有帮助，准确的回答。同时，你会拒绝一切涉及恐怖主义，种族歧视，黄色暴力等问题的回答。Moonshot AI为专有名词，不可翻译成其他语言。\"},{\"role\": \"user\", \"content\": \"" + userQuery + "\"}], \"temperature\": 0.5}";
        // error: "Invalid request: invalid character '\\r' in string literal",
        // error: "Invalid request: invalid character '\\n' in string literal",
        // json = json.replace("\r", "").replace("\n","");
        // 拼接JSON字符串
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode root = mapper.createObjectNode();
        root.put("model", "moonshot-v1-8k");

        ArrayNode messages = root.putArray("messages");

        ObjectNode systemMessage = messages.addObject();
        systemMessage.put("role", "system");
        systemMessage.put("content", "你是Kimi，由Moonshot AI提供的人工智能助手。");

        ObjectNode userMessage = messages.addObject();
        userMessage.put("role", "user");
        // 请求提问数据：Kimi好用吗？
        userMessage.put("content", userQuery);
        String json = mapper.writeValueAsString(root);

        // 发送请求
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(baseUrl))
                .header("Authorization", "Bearer " + apiKey)
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(json))
                .build();

        // 获取响应结果
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        String responseJSON = response.body();

        // 解析响应JSON字符串，获取响应结果返回
        /*
         * {
         *     "id": "chatcmpl-6751053cdc3cffd1aa1a29de",
         *     "object": "chat.completion",
         *     "created": 1733363004,
         *     "model": "moonshot-v1-8k",
         *     "choices": [
         *         {
         *             "index": 0,
         *             "message": {
         *                 "role": "assistant",
         *                 "content": "当然好用！我是Kimi，一个由Moonshot AI提供的人工智能助手。我擅长中英文对话，可以帮你解答问题、提供信息，还能阅读和理解你发送的文件内容。如果你有任何疑问或需要帮助，随时告诉我，我会尽我所能为你服务。让我们开始吧！"
         *             },
         *             "finish_reason": "stop"
         *         }
         *     ],
         *     "usage": {
         *         "prompt_tokens": 36,
         *         "completion_tokens": 62,
         *         "total_tokens": 98
         *     }
         * }
         **/
        JsonNode rootNode = mapper.readTree(responseJSON);
        JsonNode choicesNode = rootNode.get("choices");
        String content = "";
        if (choicesNode.isArray()) {
            JsonNode firstChoiceNode = choicesNode.get(0);
            JsonNode messageNode = firstChoiceNode.get("message");
            content = messageNode.get("content").asText();
        }
        return content;
    }
}
